package com.lanqiao.companymanage.utils;

import com.lanqiao.companymanage.entity.Management;
import lombok.SneakyThrows;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.swing.filechooser.FileSystemView;
import java.io.*;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 读取Excel封装成对象
 *
 * @author User
 */

public class ExcelUtils {

    /**
     * 从文件中读取Excel
     *
     * @param file
     * @return
     */
    @SneakyThrows
    public static Map<String, Object> ReadExcelToShow(File file) {
        BufferedInputStream bis = null;
        Workbook workbook = null;
        //返回值
        HashMap<String, Object> hashMap = new HashMap<>();
        //存储查询道德每一行的数据
        List<Object[]> list = new ArrayList<>();
        //失败添加的数量
        int errorCount = 0;
        //规定Excel每一行的格式
        String[] type = {"NUMERIC", "STRING", "STRING", "STRING", "NUMERIC"};
        try {
            //创建字节缓冲输出流
            bis = new BufferedInputStream(new FileInputStream(file));
            //将文件加载到工作簿里
            workbook = new XSSFWorkbook(bis);
            //获取第一张Excel表
            Sheet sheet = workbook.getSheetAt(0);
            //获取第标题行的数据个数,判断每一行应该有多少条数据
            int count = sheet.getRow(0).getPhysicalNumberOfCells();
            //获取总共有多少条数据
            int rowCount = sheet.getPhysicalNumberOfRows();
            for (int i = 1; i < rowCount; i++) {
                //获取除标题以外的每一行
                Row row = sheet.getRow(i);
                //定义一个bool类型来判断每一行的数据格式是否匹配 否则跳过
                boolean flag = true;
                //每一行的数据必须有五条数据否则跳过
                if (row.getPhysicalNumberOfCells() != count) {
                    flag = false;
                    errorCount++;
                } else {
                    for (int k = 0; k < type.length; k++) {
                        //匹配类型 有一个不匹配退出循环 返回false
                        if (!row.getCell(k).getCellTypeEnum().toString().equals(type[k])) {
                            flag = false;
                            errorCount++;
                            break;
                        }
                    }
                }
                //格式满足
                if (flag) {
                    //创建一个数组存储数据
                    Object[] emp = new Object[5];
                    emp[0] = (int) row.getCell(0).getNumericCellValue();
                    emp[1] = row.getCell(1).getStringCellValue();
                    emp[2] = row.getCell(2).getStringCellValue();
                    emp[3] = row.getCell(3).getStringCellValue();
                    emp[4] = new SimpleDateFormat("yyyy-MM-dd").format(row.getCell(4).getDateCellValue());
                    //添加数据
                    list.add(emp);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            hashMap.put("data", list);
            hashMap.put("errorCount", errorCount);
            //关闭资源
            assert bis != null;
            bis.close();
            assert workbook != null;
            workbook.close();
            //删除临时文件
            file.delete();
        }
        return hashMap;
    }

    /**
     * 导出Excel到本地
     *
     * @return
     */
    @SneakyThrows
    public static Map<String, Integer> DownLoadExcelToLocal(List<Management> list) {
        Workbook workbook = null;
        BufferedOutputStream bos = null;
        HashMap<String, Integer> hashMap = new HashMap<>();
        try {
            //创建一个工作簿
            workbook = new XSSFWorkbook();
            //创建一个字体样式
            XSSFFont font = (XSSFFont) workbook.createFont();
            //字体加粗
            font.setBold(true);
            //创建标题Excel单元格样式
            XSSFCellStyle titleCellStyle = setCellStyle((XSSFCellStyle) workbook.createCellStyle());
            //创建Excel单元格样式
            XSSFCellStyle cellStyle = setCellStyle((XSSFCellStyle) workbook.createCellStyle());
            //加载字体样式到单元格样式
            titleCellStyle.setFont(font);
            //创建第一张表
            Sheet sheet = workbook.createSheet("经营详情");
            //创建标题行
            Row title = sheet.createRow(0);
            /**
             * 设置标题行的样式和内容
             */
            setCellStyleAndValue(title.createCell(0), titleCellStyle, "项目名称");
            setCellStyleAndValue(title.createCell(1), titleCellStyle, "时间");
            setCellStyleAndValue(title.createCell(2), titleCellStyle, "投入");
            setCellStyleAndValue(title.createCell(3), titleCellStyle, "收入(万元)");
            setCellStyleAndValue(title.createCell(4), titleCellStyle, "利润");
            setCellStyleAndValue(title.createCell(5), titleCellStyle, "类型");
            font.setBold(false);
            try {
                //遍历集合中的每一个management对象
                for (int i = 0; i < list.size(); i++) {
                    //创建行
                    Row row = sheet.createRow(i + 1);
                    //填充每行中每一个单元格
                    setCellStyleAndValue(row.createCell(0), cellStyle, list.get(0).getXname());
                    setCellStyleAndValue(row.createCell(1), cellStyle, list.get(0).getXtime());
                    setCellStyleAndValue(row.createCell(2), cellStyle, modifyDecimalToDouble(list.get(0).getTouru()));
                    setCellStyleAndValue(row.createCell(3), cellStyle, modifyDecimalToDouble(list.get(0).getShouyi()));
                    setCellStyleAndValue(row.createCell(4), cellStyle, modifyDecimalToDouble(list.get(0).getLirun()));
                    setCellStyleAndValue(row.createCell(5), cellStyle, list.get(0).getLoseType());
                }
            } catch (Exception e) {
                hashMap.put("status", 500);
                return hashMap;
            }
            //获取桌面路径
            File desktop = FileSystemView.getFileSystemView().getHomeDirectory();
            //创建字节缓冲输入流 保存Excel到桌面
            bos = new BufferedOutputStream(new FileOutputStream(new File(desktop, "经营信息查看.xlsx")));
            // 保存 Excel文件
            workbook.write(bos);
        } catch (FileNotFoundException e) {
            hashMap.put("status", 500);
            return hashMap;
        } finally {
            hashMap.put("status", 200);
            assert workbook != null;
            workbook.close();
            assert bos != null;
            bos.close();
        }
        return hashMap;
    }

    /**
     * Excel样式
     *
     * @param cellStyle
     * @return
     */
    public static XSSFCellStyle setCellStyle(XSSFCellStyle cellStyle) {
        //设置表格的样式(下、上、左、右样式)
        cellStyle.setBorderBottom(BorderStyle.THIN);
        cellStyle.setBorderTop(BorderStyle.THIN);
        cellStyle.setBorderLeft(BorderStyle.THIN);
        cellStyle.setBorderRight(BorderStyle.THIN);
        //文本水平居中
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        return cellStyle;
    }

    /**
     * 填充Excel标题行
     *
     * @param cell
     * @param style
     * @param filed
     */
    public static void setCellStyleAndValue(Cell cell, XSSFCellStyle style, String filed) {
        cell.setCellStyle(style);
        cell.setCellValue(filed);
    }

    /**
     * 填充Excel标题行
     *
     * @param cell
     * @param style
     * @param date
     */
    public static void setCellStyleAndValue(Cell cell, XSSFCellStyle style, Date date) {
        cell.setCellStyle(style);
        cell.setCellValue(date);
    }

    /**
     * 填充Excel标题行
     *
     * @param cell
     * @param style
     * @param filed
     */
    public static void setCellStyleAndValue(Cell cell, XSSFCellStyle style, Double filed) {
        cell.setCellStyle(style);
        cell.setCellValue(filed);
    }

    /**
     * 保留两位小数
     *
     * @param bigDecimal
     * @return
     */
    public static Double modifyDecimalToDouble(BigDecimal bigDecimal) {
        return bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}
